高速インタープリタBIG−8+ゲーム ――――――――――――――――――――――――――――――――――――――― I/O 1982年 5月号掲載 PC−8001 32K マシン語 0E000H−0E9FFH S:0E000H ゲーム  INGARADER      ”ING” 起動方法 CLEAR100,&H9FFF MON L GE000 ゲーム:INGARADER BIG−8を起動 CLOAD”ING” RUN *LISTが取れない場合  起動前に05000Hを実行する ――――――――――――――――――――――――――――――――――――――― BIG−8(Beginner's Instrument for Games)はその名のとおり、 ゲーム専用の8ビット整数型BASIC風インタープリタです。 取り扱う数値が8ビットであるのと ソース・プログラムを中間コード化してあることにより、 そのスピードはBASICと比較すれば超高速です。 また、インタープリタのためコンパイルしたり、 アセンブルする煩雑さがなく、デバックも簡単です。 エディタは、I/O’81年11月号の 上田智章氏の“N-BASIC Consoliator”で使っている方法を応用したので、 BASICのエディタそのままです。 表1にエディタの命令を掲げます。 N−BASICのエディタを使用するため他機種への移植は無理でしょう。 (注)32K RAM PCが必要です。 表1 エディタの命令 ・−−−−−−−−−−−−−−−−−−−−−−−−−−−・ |・―――・                      | ||AUTO |                      | ||CLOAD |                      | ||CSAVE | 左記の命令は               | ||DELETE| N−BASICと同じ機能を持ちます。   | ||KEY | LINK"ファイル・ネーム":         | ||LIST | テープからファイルをロードし       | ||LLIST | メモリ上のプログラムの後に結合します。  | ||MON | OLD :誤ってNEWしたときに、      | ||MOTOR | この命令によリソース・プログラムを    | ||NEW | を復活させることができます。       | ||RENUM |                      | ||RUN |                      | |・―――・                      | ・−−−−−−−−−−−−−−−−−−−−−−−−−−−・ ===================         文法          =================== (1) 行  行の最初にBASICと同様に0〜65529の文番号を書きます。  マルチステートメントが使用可能です。 (2) 定数  定数には文字定数および数値定数の2種類があります。  文字定数は引用符に囲まれた一文字のキャラクタです。  数値定数は0〜255の10進整数と&H00〜&HFFの16進数です。 (3) 単純変数  変数名は英文字一文字です。  文字変数はありません。  また、RUNしたとき最初の値は不定です。 (4) 配列変数  配列変数は一次元のみで次の形式をしています。  ・―――――――――――――――――・  | 変数名(式)          |  ・―――――――――――――――――・  変数が上位8ビット、式が下位8ビットをあらわす番地に対して  読み書きを行ないます。  ・―――――――――――――――――・  |例|A=&HC0:B=A(0)         |  ・―――――――――――――――――・  これはBASICのB=PEEK(&HC000)と同じです。  ・―――――――――――――――――・  |例|A=&HC0:A(0)=10        |  ・―――――――――――――――――・  これはBASICのPOKE(&HC000,10)と同じです。 (5)演算子  演算子としては次のものがあります。  +、−、*、/、AND、OR、XOR、=、>、<、#  (#はBASICの<>)  優先順位はないので、必要なときにはカッコを使用してください。  なお、関係演算子はそれが“真”のときには255を、  “偽”のときには0をその値とします。  式は変数と定数をこれらの演算子で結んだものです。 (6)関数 ■INP(式):式の値で示されるポートから入力したデータを与えます。 ■RND:0〜255の乱数を与えます。 ■STICK:テン・キーの[2]、[4]、[6]、[8]の  いずれかが押されているとそのキーの値を与えます。  どのキーも押されていないときには0となります。 ■STRIG:[SPACE]バーが押されていると“真”、  押されていなければ“偽”を与えます。 ■INKEY$:キーボードから一文字入力します。  キーが押されるまで待ちます。 ■[単純変数名+]:変数の値を関数の値とした後、  変数の値を1だけ増加します。 ■[単純変数名−]:変数の値を1だけ減少し、それを関数の値とします。  ・――――――――――――――――――――――――――・  |例|A=1:B=[A+]                   |  ・――――――――――――――――――――――――――・  これを実行するとAは2、Bは1となる。  ・――――――――――――――――――――――――――・  |例|A=1:B=[A-]                   |  ・――――――――――――――――――――――――――・  これを実行するとA、Bともに0となる。 (7)ステートメント ■代入文: 変数=式  式の値を変数に代入します。 ■CALL&Hnnnn  マシン語サブルーチンを実行します。 ■DATA(&Hnnnn)定数[,定数…]  指定した番地からデータを格納します。  番地を省略した場合は、  以前に実行したDATA文の続きとして実行します。 定数の代わりに“文字列”とすれば、ASCIIコードが格納されます。 ■END  プログラムの実行を終了します。 ■GET(式,式,式,式)  画面のキャラクタまたはドット・グラフィックス  をメモリヘセーブします。  後で詳しく述べます。 ■GOSUB 行番号  行番号から始まるサブルーチンをコールします。 ■GO TO 行番号  行番号ヘジャンプします。 ■IF 式 THEN 文1 ELSE 文2  式の値が0でなければ文1を、0ならば文2を実行します。  ELSE以下は省略が可能です。  多重化(ネスティング)ができます。  N−BASICのようなIF〜GOTOあるいは  IF〜THEN行番号などは使えません。 ■INPUT単純変数[,単純変数名…]  キーボードから数値を入力します。  疑問符はプリンタされません。  単にキャリッジ・リターンだけを入力すると  変数の値は0になります。  1つの変数に対して、  1度ずつキャリッジ・リターンを押す必要があります。  ・――――――――――――――――――――――――――・  |例|INPUT A,B                    |  ・―・                        |  | これを実行したとき、次のように入力します。    |  | [5][CR]                     |  | [4][CR]                     |  | (N−BASIC)では[5][,][4][CR]          |  ・――――――――――――――――――――――――――・ ■LOCATE 式1,式2  式1を水平位置、式2を垂直位置としてカーソルを移動します。 ■MINUS単純変数名=(式1,式2,式3,式4)  式1を上位8ビット、式2を下位8ビットとする16ビット整数から、  式3を上位8ビット、式4を下位8ビットとする16ビット整数を引き、  結果の下位8ビットを指定した単純変数に  上位8ビットをその次の単純変数に代入します。  ・――――――――――――――――――――――――――・  |例|MINUS A=(1,0,0,1)                |  ・――――――――――――――――――――――――――・  これを実行するとAは255、Bは0となります  (この引き算は&H0100−&H0001を計算している)。 ■PRINT 式[,”文字列”,/(改行),…]  ディスプレイに式の値、文字列を出力します。  単に改行だけするときは次のとおりです。  ・――――――――――――――――――――――――――・  |例|PRINT /                     |  ・――――――――――――――――――――――――――・  式が複数のときは間か開かないので次のようにします。  ・――――――――――――――――――――――――――・  |例|PRINT A," ",B+C,/                |  ・――――――――――――――――――――――――――・  省略形として”?”は使えません。 ■PLUS 単純変数名=(式1,式2,式3,式4)  MINUSと同様に16ビット整数の足し算に使います。 ■PUT(式,式,式,式)  メモリの内容をキャラクタまたはドット・グラフィックスとして  画面へロードします。  後で詳しく述べます。 ■REMあるいは、“’”  注釈行であることを示します。 ■REPEAT  UNTILを見てください。 ■RETURN  サブルーチンから戻ります。 ■SOUND 式1,式2  式1が上位8ビット、式2が下位8ビットの番地からを  データとして音を出力します。  デ−タの以後に&HFFをいれておきます。  I/O’80年12月号山上潤氏のプログラムを使わせていただきました。  E375番地に音長、E38F番地にチューニングのデータがあります。 ■UNTIL 式  式の値が0ならばREPEATの次の文から繰り返します。  多重化(ネスティング)ができます。  ループの外ヘジャンプしたり、ループの中ヘジャンプすることはできません。  ・――――――――――――――――――――――――――・  |例|K=0:REPEAT                   |  | |UNTIL[K+]=10                  |  ・――――――――――――――――――――――――――・  これはBASICで書くと次のようになります。  ・――――――――――――――――――――――――――・  | FOR K=0 TO 10                   |  | NEXT K                      |  ・――――――――――――――――――――――――――・  ・――――――――――――――――――――――――――・  |例|K=0:REPEAT                   |  | |UNTIL[K-]=0                   |  ・――――――――――――――――――――――――――・  これはBASICで書くと次のようになります。  ・――――――――――――――――――――――――――・  | FOR K=10 TO 1 STEP -1               |  | NEXT K                      |  ・――――――――――――――――――――――――――・ ■WPRINT 単純変数名  指定した変数の値を下位8ビット、  その次の変数の値を上位8ビットとする16ビット整数の値を出力します。 (8)画面制御命令  次の命令はN−BASICと同様に使えます。  ただし、パラメータは数値定数のみ使えます。  COLOR、CONSOLE、WIDTH ===================     BiG−8の走らせ方      =================== まず、PCのスイッチを入れて次のようにします。 ・―――――――――――――――――・ | CELAR 100,&H9FFF[CR]      | | MON[CR]             | | *SE000[CR]           | ・―――――――――――――――――・ 後はE000〜E9FFまでリストを打ち込みます。 そして次のようにテープにセーブします。 ・―――――――――――――――――・ | *WE000,E9FF[CR]         | ・―――――――――――――――――・ テープから入力するときも、CLEAR文を忘れないでください。 BIG−8の起動は次のようにします。 ・―――――――――――――――――・ | *GE000[CR]           | ・―――――――――――――――――・ 後はBASICと同じ方法でプログラムを入れ、 RUN[CR]で実行します。 実行の途中で中止したいときは、[STOP]キーを押してください。 ===================        PUT文         =================== BIG−8が起動したら、 後は動きまわるエイリアンをミサイルで撃墜するプログラムを、 BASICのような手軽さ書けばよいのです。 さて、その動きまわるエイリアンを表示するのに使うのが、 PUT文です。 PUT文は次の形式をしています。 ・――――――――――――――――――――――――――・ | PUT (式1,式2,式3,式4)           | ・――――――――――――――――――――――――――・ 式1は座標の水平位置、 式2は垂直位置をそれぞれキャラクタ単位で指示します。 また、式3か上位8ビット、式4が下位8ビットを表わす番地から データが格納してあることを示します。 指定された番地には図形の横のサイズ、 次の番地に縦のサイズをそれぞれキャラクタ単位書き込んでおき、 その次の番地からキャラクタ単位のデータを書き込んでおきます。 図1のインベーダーを表示するプログラムをリスト1に示します。 図1 ・−−−−−−−−−−−−−−−−−−−−−−−−−−−・ |                           | |          _____4_____            | |          | |           | |・-----------・   -・-----------・           | ||# | | | #|  | | | | | |           | ||##| | |##|  | |63|C8|8C|36|           | || #| #|# |# |  | | | | | |           | || |##|##| |  | | | | | |           | ||--+--+--+--| ⇒2 |--+--+--+--|           | || #|##| #|# |  | | | | | |           | ||##|# |# |##|  | |7E|D7|5A|E7|           | ||##|##| #|##|  | | | | | |           | ||# | #|# | #|  | | | | | |           | |・-----------・   -・-----------・           | |                           | | ・----・ ・----・   ・----・             | | |1 16| |■ |   |1 0|             | | |2 32| |■■| → |2 32| →1+2+32+64=&H63    | | |4 64| | ■|   |0 64|             | | |8128| |  |   |0 0|             | | ・----・ ・----・   ・----・             | | キャラクタごとに数値化する             | |                           | |                           | ・−−−−−−−−−−−−−−−−−−−−−−−−−−−・ リスト1 10 WIDTH 40,25:CONSOLE 0,25,0,1 20 CLS 30 DATA (&HD000) 4,2,&H63,&HC8,&H36,&H7E,&HD7,&H5A,&HE7 40 PUT(10,10,&HD0,&H0) ===================        GET文         =================== PUT文と逆の働きをするのがGET文です。GET文は次の形式をしています。 ・――――――――――――――――――――――――――・ | GET (式1,式2,式3,式4)           | ・――――――――――――――――――――――――――・ 式1、式2はPUT文と同じです。 式3、式4が示す番地に横のサイズ、次の番地に縦のサイズを書いておくと その次の番地から画面のデータがメモリにセーブされます。 ===================      INGARADER      =================== BIG−8でゲームを作ってみました。 宇宙船はテンーキーの[4]と[6]で左右に動き、 [スペース]キーでビームが発射されます。 UFOは300点、インギャラダーは10点、 ロケット・ミサイルは引きつけて撃つと高得点が、それぞれ得られます。 これだけ知っていれば遊べます。 単純なゲームですが、インギャラダーの動きが面白いと思います。 なお、PUT文ではキャラクタごとの色の指定ができないので アトリビュート・エリアで色の指定をしています (プログラム250行〜280行)。 ===================         最後に         =================== とてもインタープリタとは思えないスピードだと 自分では気にいっています。 多くの人に使ってもらいたいと願っています。 【】参考文献 上田智幸氏:“N-BASIC Consolidator”、I/O、’81年11月号